
import { getToken, setToken, removeToken } from '@/utils/auth'
import { loginAPI, getUserProfileAPI, getUserPhotoAPI } from '@/api'

const getDefaultState = () => {
  return {
    token: getToken(), // 存取token
    userInfo: JSON.parse(localStorage.getItem('userInfo')) || {} // 用于存取用户信息
  }
}

const state = getDefaultState()

const mutations = {
  RESET_STATE: (state) => {
  // 重置当前模块state对象
  // Object.assign() 是吧参数2往后的所有对象里key+value, 复制到第一个参数的对象身上
  // getDefaultState()调用后,拿到上面默认初始的state对象, 给现有state对象重新覆盖值
    Object.assign(state, getDefaultState())
  },
  // 修改 token
  SET_TOKEN: (state, newToken) => {
    state.token = newToken
    setToken(newToken)
  },
  // 移除 token
  REMOVE_TOKEN: (state) => {
    state.token = ''
    removeToken()
  },
  // 修改用户信息
  SET_USERINFO: (state, value) => {
    state.userInfo = value
    localStorage.setItem('userInfo', JSON.stringify(value)) // 用户信息存入本地
  },
  // 删除用户信息
  REMOVE_USERINFO: (state) => {
    state.userInfo = {}
    localStorage.removeItem('userInfo')
  }
}

const actions = {
  // 登陆逻辑-封装
  async loginActions({ commit }, value) {
    const res = await loginAPI(value)
    commit('SET_TOKEN', res.data)
    // 逻辑页面还在接收数组
    return res
  },
  // 获取用户信息
  async getuserInfoAction({ commit }) {
    const res = await getUserProfileAPI()
    // console.log(res)
    // 获取个人头像
    const user = await getUserPhotoAPI(res.data.userId)
    // 存取两个部分为一个对象
    commit('SET_USERINFO', { ...res.data, ...user.data })
  },
  // 退出登陆
  async logoutAction({ commit }) {
    commit('app/RESET_ASYNCROUTE', null, { root: true })
    commit('REMOVE_TOKEN')
    commit('REMOVE_USERINFO')
    commit('RESET_STATE')
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

